import axios from 'axios'
import { Toast } from 'vant'
import store from '../store'

// 区分开发环境与生产环境下资源请求的基准 URL
// const baseURL = process.env.NODE_ENV === 'development' ? '' : 'http://quanzhan.site:3000'

// 创建 axios 实例
const service = axios.create({
  baseURL: 'http://quanzhan.site:3000', // 请求接口的基准 URL，会自动添加到每个请求 url 前边，除非请求的 url 是一个绝对路径
  // baseURL,
  timeout: 10000, // 超时时间
})

// 请求拦截
service.interceptors.request.use(config => {
  // 在发送请求之前做些什么
  // 比如提示加载中
  Toast.loading({
    message: 'loading...', // 加载中提示信息
    duration: 0, // 提示框显示时长，为 0 不会自动关闭
  })
  // 比如在请求头中添加传递 token 认证字段
  const token = store.getters['user/token']
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
}, error => {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 响应拦截
service.interceptors.response.use(response => {
  // 关闭加载提示信息
  Toast.clear()
  /* 对响应数据做点什么
   * 比如统一对后端返回的数据进行规范处理
   */
  // 对响应的 status 判断是否请求成功
  if (response.status === 200) {
    // 请求成功，则后端接口返回的数据被包装在 data 属性中
    // 后端返回的是一个 JSON 对象格式的数据，有 code、data、message 属性
    const { code, data, message } = response.data
    // 对后端返回的数据进行规范处理
    if (code === 200) {
      return data
    }

    if (code === 400) { // 400 表示 token 异常
      // 重置清空前端用户登录的状态数据
      store.commit('user/reset')
      // 跳转到登录页面重新登录
      // window.location.reload()
      window.location.href = '#/login'
    }

    // 如果 code 不为 200 则说明存在请求异常，则将 Promise 对象的
    // 状态修改为 rejected，并指明错误原因
    const error = new Error(message)
    return Promise.reject(error)
  }

  // http 状态码不为 200 则说明请求出现问题
  const err = new Error('请求出现异常, HTTP 状态码不为 200')
  return Promise.reject(err)
}, error => {
  // 对响应错误做点什么
  return Promise.reject(error)
})

export default service
